package com.bestcem.xm.ticket.service;

import com.bestcem.xm.common.core.domain.web.ServiceResult;
import com.bestcem.xm.ticket.controller.param.ExportTicketParam;
import com.bestcem.xm.ticket.controller.vo.SimpleIdVO;
import com.bestcem.xm.ticket.controller.vo.ticket.TicketInfoVO;
import com.bestcem.xm.ticket.controller.vo.ticket.TicketPageVO;
import com.bestcem.xm.ticket.dao.dto.TicketInfo;
import com.bestcem.xm.ticket.entity.mongo.Ticket;
import com.bestcem.xm.ticket.grpc.client.dto.user.UserDTO;
import com.bestcem.xm.ticket.service.dto.DatetimeFilter;
import com.bestcem.xm.ticket.service.dto.FileDTO;
import com.bestcem.xm.ticket.service.dto.PageDTO;
import com.bestcem.xm.ticket.service.dto.RegionFilter;
import com.bestcem.xm.ticket.service.dto.dashboard.DashboardDTO;
import com.bestcem.xm.ticket.service.dto.mq.MemberFootPrint;
import com.bestcem.xm.ticket.service.dto.mq.TicketStatusUpdateDto;

import java.util.List;

/**
 * @author liheng
 * @version v1.0
 * @date 2021/8/18 14:55
 */
public interface TicketService {

    /**
     * 检查问卷是否有工单生成
     *
     * @param surveyId 问卷id
     * @return 是否有工单生成
     * @author liheng
     * @date 2021/8/25 13:55
     */
    Boolean checkSurveyHasTicket(String surveyId);

    /**
     * 根据id查询下一个Ticket
     *
     * @param id     工单id
     * @param orgId  公司id
     * @param userId 当前用户id
     * @return Ticket 信息
     * @author zq.ding <zq.ding@idiaoyan.com>
     * @date 2021/8/11 15:36
     */
    ServiceResult<SimpleIdVO> nextTicket(String id, String orgId, String userId);

    /**
     * 获取单个工单信息 ( 2.3版 )
     *
     * @param id 工单id
     * @return 返回前端需要的工单信息
     * @author liheng
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2021/9/10 0:50
     */
    ServiceResult<TicketInfoVO> getTicketInfo(String id, String userId);

    /**
     * 根据二次投放的答卷状态，进行二次投放，并更改工单状态
     *
     * @param ticketStatusUpdateDto
     * @return void
     * @author jy.zhao
     * @date 2021/8/23 20:45
     **/
    void updateTicketStatusAndDeliver(TicketStatusUpdateDto ticketStatusUpdateDto);

    /**
     * 1.创建工单记录
     * 2.发送工单记录mq
     * 3.根据工单id检查并进行二次投放
     * 4.更新工单状态
     *
     * @param ticket  信息工单
     * @param operate 操作，1.工单处理成功 2.工单处理失败。 目前可能会只有这两种操作，
     * @author jy.zhao
     * @date 2021/8/26 14:22
     **/
    void handleTicket(String operate, Ticket ticket);

    /**
     * 导出工单
     *
     * @param param 导出入参
     * @return 返回文件DTO
     * @author zq.ding <zq.ding@idiaoyan.com>
     * @date 2021/8/26 17:33
     */
    ServiceResult<FileDTO> export(ExportTicketParam param);

    /**
     * 根据参数获取工单图表数据
     *
     * @param regionFilter   工单图表统计 公司/区域 统计参数
     * @param datetimeFilter 工单图表统计 时间 统计参数
     * @return 工单图表数据
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2021/8/27 16:12
     */
    ServiceResult<DashboardDTO> getDashboardData(RegionFilter regionFilter, DatetimeFilter datetimeFilter);

    /**
     * 分页获取工单
     *
     * @param param 获取条件入参
     * @return 返回分页DTO
     */
    ServiceResult<PageDTO<TicketPageVO>> pageTickets(ExportTicketParam param);

    /**
     * 删除工单
     *
     * @param ticketId 工单id
     * @return 删除的数量
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2021/8/26 15:09
     */
    ServiceResult<Long> deleteTicket(String ticketId);

    /**
     * 获取当前负责工单的人,没有处理人的话返回空的list
     *
     * @param ticketInfo
     * @return
     */
    List<UserDTO> getCurrentTicketUsers(TicketInfo ticketInfo);

    /**
     * 开启同步联系人，会根据题目中的手机号和邮箱新建或者更新联系人，
     * 当创建或者更新联系人之后把答卷信息更新到联系人足迹表（Java数据库）中
     * java创建联系人更新答卷之后，会发过来答卷的seq，Python这边查到答卷更新联系人足迹
     *
     * @param memberFootPrint 足迹点
     * @author jy.zhao
     * @date 2021/9/16 10:49
     **/
    void createFootPrint(MemberFootPrint memberFootPrint);
}
